【メモ】gRPCのクライアントツールpolyglotでサンプルアプリケーションに接続する
ども、大瀧です。
先月GAを迎えたGoogle製RPCフレームワークgRPCをちまちま触っています。
今回はgRPCサーバーへの接続をデバッグするためのクライアントツールpolyglotの最低限の使い方を、サンプルアプリケーションを実行するgRPCサーバーを使ってご紹介します。
セットアップ
polyglotはJava版gRPCクライアントのCLIツールです。手元のマシンにJREをインストールしリリースページからjarファイルをダウンロード、実行すればOKです。
動作確認環境
- OS: macOS Sierra
- Java: バージョン1.8.0_51
- polyglot: v1.2.0
$ java -jar polyglot.jar --help [main] INFO me.dinowernli.grpc.polyglot.Main - Polyglot version: 1.2.0 [main] INFO me.dinowernli.grpc.polyglot.Main - Usage: [--add_protoc_includes <path1>,<path2>] [--command <call|list_services>] [--config_name <config-name>] [--config_set_path <path/to/config.pb.json>] [--deadline_ms <number>] [--endpoint <host>:<port>] [--full_method <some.package.Service/doSomething>] [--help] [--method_filter method_name] [--output_file_path <path>] [--proto_discovery_root <path>] [--service_filter service_name] [--tls_ca_cert_path <path>] [--use_tls true|false] [--with_message true|false] $
こんな感じに表示されればOKです。なお、自分の環境では環境変数JAVA_HOME
の設定を求められたので、/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home
を指定しました。
使い方
gRPCのクライアント/サーバーのインターフェースは、Protocol Bufferバージョン3の.proto
ファイルで定義します。サンプルアプリケーションのhelloworld.proto
を以下に示します。
syntax = "proto3"; option java_multiple_files = true; option java_package = "io.grpc.examples.helloworld"; option java_outer_classname = "HelloWorldProto"; package helloworld; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }
gRPCで利用する.proto
ファイルには、サービス定義とメッセージ定義がそれぞれ記述されます。gRPCのサービスは、rpc
がクライアントが呼び出すAPIコール、service
およびpackage
はrpc
をグルーピングする上位階層です。rpc
のリクエスト、レスポンスをそれぞれmessage
を指定します。今回は、12行目のSayHello
をコールしてみたいと思います。
- リクエストメッセージ: polyglotはJSONリクエストメッセージを標準入力から入力するため、
echo
コマンドからパイプラインでpolyglotに渡しましょう。今回はHelloRequest
メッセージがリクエストになるので、そのプロパティであるname
を指定します。 --command
オプション: 通常のリクエストではcall
になります。--endpoint
オプション: gRPCサーバーのホスト名:ポート番号を指定します。--full_method
オプション:<package>.<service>/<rpc>
の形式でAPIを指定します。--proto_discovery_root
オプション:.proto
ファイルを配置しているディレクトリ名を指定します。--use_tls
オプション: TLS接続する場合はtrue
を指定(デフォルトはfalse
)--tls_ca_cert_path
オプション: TLS接続時のCA証明書を指定 *1
以下のような感じで実行してみます。
$ echo "{'name':'world'}" | java -jar polyglot.jar \ --command=call \ --endpoint=grpc.otaki.classmethod.info:50051 \ --full_method=helloworld.Greeter/SayHello \ --proto_discovery_root=/Users/ryuta/.go/src/google.golang.org/grpc/examples/helloworld/helloworld/ --use_tls=true \ --tls_ca_cert_path=/usr/local/etc/openssl/cert.pem [main] INFO me.dinowernli.grpc.polyglot.Main - Polyglot version: 1.2.0 [main] INFO me.dinowernli.grpc.polyglot.Main - Loaded configuration: default [main] INFO me.dinowernli.grpc.polyglot.command.ServiceCall - Creating dynamic grpc client [main] INFO io.grpc.internal.ManagedChannelImpl - [ManagedChannelImpl@63355449] Created with target grpc.otaki.classmethod.info:50051 [main] INFO me.dinowernli.grpc.polyglot.command.ServiceCall - Making rpc with 1 request(s) to endpoint [grpc.otaki.classmethod.info:50051] [main] INFO me.dinowernli.grpc.polyglot.grpc.DynamicGrpcClient - Making unary call [grpc-default-executor-1] INFO me.dinowernli.grpc.polyglot.io.LoggingStatsWriter - Got response message { "message": "Hello world" } [grpc-default-executor-1] INFO me.dinowernli.grpc.polyglot.io.LoggingStatsWriter - Completed rpc with 1 response(s) $
レスポンスがJSON形式で表示されました! なお、オプションは以下のようにコンフィグファイルに記述することもできるので、オプション数を減らすために利用しても良いでしょう。
{ "configurations": [ { "name": "default", "call_config": { "use_tls": "true", "tls_ca_cert_path": "/usr/local/etc/openssl/cert.pem" } } ] }
まとめ
gRPCのクライアントツール、polyglotの基本的な使い方をご紹介しました。Streamingのときはどうなるかなど、まだ気になる点がいろいろあるので、引き続き調べてみたいと思います。
脚注
- 今回はpolyglot既定のCA証明書がLet's Encryptに対応していなかったためHomebrewのOpenSSLのCA証明書を指定 ↩